What is Copilot Studio?
Microsoft Copilot Studio (formerly Power Virtual Agents) is a low-code / no-code platform for building intelligent conversational agents β called Copilots β that can be embedded into websites, Microsoft Teams, mobile apps, and more. No deep AI/ML knowledge required.
Why Copilot Studio?
Low-Code Speed
Build and deploy a functional chatbot in hours, not months, using drag-and-drop visual editors.
Built-in GPT
Leverages Azure OpenAI / GPT models for generative answers over your own knowledge sources.
Deep Integrations
Connects to Power Automate, Dataverse, SharePoint, Dynamics 365, and 900+ connectors.
Multi-Channel
Deploy to Teams, websites, mobile, WhatsApp, Slack, and custom channels via Direct Line.
Architecture Overview
Core Concepts at a Glance
| Term | What it means | Analogy |
|---|---|---|
| Copilot | The bot / conversational agent you build | A smart assistant |
| Topic | A conversation flow triggered by user intent | A script for a specific subject |
| Trigger Phrase | Words/phrases that activate a topic | A keyword that rings a bell |
| Node | A single step inside a topic (message, question, action) | One step in a flowchart |
| Entity | Data type extracted from user input (name, date, number) | A form field |
| Variable | Stored value used across the conversation | A variable in code |
| Action | Calls to external flows, APIs, or connectors | A function call |
Copilot Studio vs Traditional Bot Frameworks
| Feature | Copilot Studio | Bot Framework SDK |
|---|---|---|
| Skill needed | Low-code / citizen dev | Pro developer (C#, Python) |
| Time to first bot | Minutes | Days to weeks |
| Generative AI | Built-in (GPT) | Must integrate manually |
| Custom logic | Via Power Automate / plugins | Full code control |
| Cost model | Per session or message | Azure infra costs |
Access: Sign up at copilotstudio.microsoft.com with a Microsoft 365 or Power Platform license. A free trial is available.
Explore & Map
Before building anything, explore the platform to get oriented.
- Sign up / log in to
copilotstudio.microsoft.com - Identify one real-world business use case at your company or a company you know that a Copilot could solve
- Write a 3-sentence description: Who uses it? What pain does it solve? What data does it need?
- List 5 trigger phrases a user might say to start that conversation
Interface & Navigation
Before you build, you need to know your way around. Copilot Studio has a clean canvas-based UI with a left navigation panel, a topic authoring canvas, and a live test panel. Let's tour every key area.
The Home Screen
Home Dashboard
Shows your recently edited Copilots, usage analytics at a glance, and quick-start templates. The top bar shows your environment and tenant.
Left Navigation Rail
Topics β all your conversation flows. Actions β reusable integrations. Knowledge β documents/URLs for generative answers. Analytics β session data. Settings β security, channels, AI features.
Authoring Canvas
A node-based flowchart editor where you visually build conversation paths. Drag nodes, connect branches, and configure properties on the right panel.
Test Chat Panel
A live chat window (toggled with the "Test your copilot" button) that lets you test your bot instantly without publishing. Changes appear in real time.
Publish & Channels
When your bot is ready, publish it and choose channels: Teams, Web, custom Direct Line, etc. Each channel has its own configuration screen.
System Topics (Pre-Built)
Every new Copilot comes with built-in system topics. You should know these:
| System Topic | Triggers When⦠| Can You Edit? |
|---|---|---|
| Greeting | User starts conversation | β Yes |
| Goodbye | User says bye/thanks | β Yes |
| Escalate | User asks for a human | β Yes |
| Fallback | No topic matches | β Yes |
| Start Over | User says "restart" | β Yes |
| Error | An action/flow fails | β Yes |
Best practice: Always customize the Greeting and Fallback topics first. A good greeting sets tone; a good fallback prevents dead ends. Add a "Did you mean�" suggestion to Fallback.
Node Types in the Canvas
Send a Message
Bot speaks. Supports text, images, buttons, adaptive cards, and rich content.
Ask a Question
Prompts user for input. Captures the answer into a variable with an entity type.
Condition (Branch)
If/else logic based on variable values. Splits the conversation into multiple paths.
Action (Plugin/Flow)
Calls Power Automate flows, HTTP connectors, or Dataverse operations.
Redirect to Topic
Jumps to another topic mid-conversation. Great for reusable sub-flows.
End Conversation
Gracefully terminates the session (with optional survey).
Interface Safari
- Open Copilot Studio and create a new blank Copilot (name it anything)
- Click through all 6 left-nav sections and note what each one contains
- Open the Fallback system topic β what message does it currently send? Customize it to add a button that redirects to the Greeting topic
- Use the Test Chat panel and type something random (e.g., "What is the meaning of life?") β what happens?
Your First Copilot
We'll build a HR FAQ Bot β a copilot that answers employee questions about leave policy, benefits, and payroll. By the end of this lesson you'll have a working, publishable bot.
Contoso Corp's HR team receives 200+ repetitive Slack messages per week about "How many vacation days do I have?" and "When is payday?". We'll automate these answers.
Step-by-Step: Create the Bot
Create a New Copilot
Go to copilotstudio.microsoft.com β Create β New copilot. Name it "Contoso HR Bot". Choose language: English. Skip the template for now.
Edit the Greeting
Open Topics β Greeting. Change the default message to: "Hi! I'm the Contoso HR assistant. I can help with vacation, payroll, and benefits. What would you like to know?"
Create a New Topic: "Vacation Days"
Go to Topics β + Add a topic β From blank. Name it "Vacation Days". Add trigger phrases (see below). Add a Send Message node with the policy info.
Add Quick Replies
At the end of your message node, click + Add β Quick replies. Add: "Tell me about payroll" and "I'm done, thanks". These help guide users to related topics.
Test It
Click Test your copilot (bottom left). Type "how many vacation days do I get?" β the bot should respond with your topic. If not, check your trigger phrases.
Trigger Phrases for "Vacation Days"
how many vacation days do i get what is the vacation policy annual leave allowance how much PTO do i have time off policy how many days off per year holiday entitlement
How many triggers do you need? Add at least 5-8 diverse phrasings. Copilot Studio uses NLU (Natural Language Understanding) so small variations are handled automatically, but more variety = better accuracy.
Bot Response with Adaptive Card
Instead of plain text, use an Adaptive Card for richer responses. In the message node, click +Add β Adaptive card and paste this JSON:
{
"type": "AdaptiveCard",
"version": "1.4",
"body": [
{
"type": "TextBlock",
"text": "ποΈ Vacation Policy",
"size": "Large",
"weight": "Bolder"
},
{
"type": "FactSet",
"facts": [
{ "title": "Year 1-2", "value": "15 days" },
{ "title": "Year 3-5", "value": "20 days" },
{ "title": "Year 6+", "value": "25 days" }
]
}
]
}
Topic Flow: Payroll FAQ
Create a second topic called "Payroll" with a branching question:
// Topic: Payroll // Trigger: "when is payday", "salary date", "pay schedule" ASK QUESTION: "Are you salaried or hourly?" OPTIONS: ["Salaried", "Hourly"] SAVE TO: EmploymentType (variable) CONDITION: EmploymentType = "Salaried" β SEND MESSAGE: "Salaried employees are paid on the 25th of each month." ELSE: β SEND MESSAGE: "Hourly employees are paid every Friday." β END CONVERSATION
Build the HR Bot
- Build the full Vacation Days topic with an Adaptive Card response
- Build the Payroll topic with a branching question (Salaried vs Hourly)
- Create a third topic: "Benefits" β list 3 employee benefits with quick reply buttons
- Test all 3 topics in the test pane and note which trigger phrases work and which don't
- Bonus: Add a "Redirect to Topic" at the end of each topic so the user can always ask another question
Topics & Trigger Phrases
Topics are the heart of Copilot Studio. Understanding how topics are triggered, structured, and interconnected is the key skill that separates average bots from great ones.
How Trigger Matching Works
Copilot Studio uses a Natural Language Understanding (NLU) model to match user input to topics. It's not keyword matching β it understands intent.
Intent Matching
The NLU model maps the user's message to the closest topic based on semantic similarity, not just exact keywords.
Confidence Score
Each match has a confidence score. If below a threshold, the Fallback topic fires instead.
Best Match Wins
If multiple topics could match, the highest-confidence one wins. Keep trigger phrases unique per topic.
Minimum 5 Phrases
Microsoft recommends at least 5 trigger phrases per topic for reliable NLU performance.
Topic Types
| Type | Created By | Purpose |
|---|---|---|
| Custom Topic | You | Your business-specific conversation flows |
| System Topic | Platform | Greeting, Fallback, Escalate, etc. |
| Lesson Topics | Templates | Sample topics in starter bots (can delete) |
Advanced Topic Design Patterns
Pattern 1: Multi-Turn Conversation
// Topic: Book a Meeting Room ASK: "Which office location?" β Office ASK: "What date?" β MeetingDate ASK: "How many attendees?" β Attendees SEND: "Checking availability for {Office} on {MeetingDate}..." ACTION: Call Power Automate flow β BookRoomFlow SEND: "Room {RoomName} is booked! β "
Pattern 2: Disambiguation
When a user says something vague like "I need help with account", you can ask a clarifying question:
ASK: "What kind of account help do you need?" OPTIONS: [ "Reset Password" β Redirect to Password Reset topic "Update Profile" β Redirect to Profile Update topic "Billing Issue" β Redirect to Billing topic "Something else" β Redirect to Escalate topic ]
Pattern 3: Global Variables with "Track Context"
Global variables (prefixed with Global.) persist across topics in a session. Use them to track user identity, authenticated status, or language preference once, then use everywhere.
Topic Authoring Best Practices
| β Do | β Don't |
|---|---|
| Use 5-10 diverse trigger phrases | Use only 1-2 triggers |
| Keep topics focused on one intent | Cram multiple intents into one topic |
| Add "End Conversation" or redirect at the end | Leave dead-end topics with no exit |
| Customize the Fallback topic | Leave the default Fallback as-is |
| Test with realistic user language | Test only with your exact trigger phrases |
Topic Architecture Design
- Design a Customer Support Bot topic map on paper/Miro: identify 5 topics, their triggers, and how they interconnect via Redirects
- Build 2 of those topics in Copilot Studio with at least one branch condition each
- Create a disambiguation hub topic called "I need help" that asks a clarifying multiple-choice question and redirects to the right topic
- Test: try 10 different phrasings and record which ones hit the wrong topic (these are your false positives to fix)
Entities & Variables
Entities let you extract structured data from user messages. Variables let you store and reuse that data across your conversation. Together they power dynamic, intelligent conversations.
What are Entities?
An entity is a data type applied to a user's input when you ask a question. Copilot Studio has built-in entities and lets you create custom ones.
Built-in Entities
| Entity | Recognizes | Example Input β Extracted Value |
|---|---|---|
| Person name | Human names | "Call John Smith" β John Smith |
| Email addresses | "my email is [email protected]" β [email protected] | |
| Date and time | Dates, times, durations | "next Monday at 3pm" β 2026-03-09T15:00 |
| Number | Integers, decimals | "I need 5 tickets" β 5 |
| Phone number | Phone formats | "my number is 555-1234" β 555-1234 |
| City | City names | "I'm in Montreal" β Montreal |
| Boolean | Yes/No | "yes please" β true |
Custom Entities
Custom entities let you recognize domain-specific values β like product names, department codes, or order statuses.
Closed List Entity
A fixed set of values you define. E.g., Department = ["HR", "IT", "Finance", "Marketing", "Sales"]. Copilot handles synonyms: "information technology" β IT.
Regex Entity
Matches text using a regular expression pattern. Perfect for Order IDs (ORD-\d{6}), employee codes, or SKUs.
Example: Custom "Department" Entity
Entity Name: Department Type: Closed list Values & Synonyms: HR β ["human resources", "people team", "hr dept"] IT β ["information technology", "tech support", "helpdesk"] Finance β ["accounting", "payroll team", "finance dept"] Marketing β ["comms", "marketing team"]
Variables: Types & Scope
| Variable Type | Scope | Prefix | Use Case |
|---|---|---|---|
| Topic Variable | Current topic only | (none) | Temporary data within one flow |
| Global Variable | Entire conversation session | Global. | Username, auth token, language |
| System Variable | Platform-provided | System. | User ID, channel, conversation ID |
Using Variables in Messages
// After capturing user's name into Global.UserName SEND MESSAGE: "Thanks, {Global.UserName}! I've raised a support ticket for the {Department} team. Your ticket number is {TicketID}. Our team will respond within 24 hours." // Result example: // "Thanks, Amir! I've raised a support ticket for the IT team. // Your ticket number is TK-00341. Our team will respond within 24 hours."
Variable Manipulation with Power Fx
Copilot Studio supports Power Fx (Excel-like formula language) for transforming variables:
// Concatenate strings Concatenate("Hello, ", Global.UserName, "!") // Today's date formatted Text(Today(), "MMMM DD, YYYY") // Conditional expression If(Topic.AttendeeCount > 10, "Large room", "Small room") // Upper case Upper(Topic.Department) // Check if email is valid IsMatch(Topic.Email, Match.Email)
Common Mistake: Trying to use a topic variable outside its topic. If you need data to persist across topics (like a logged-in user's name), use a Global. variable instead.
Dynamic IT Support Bot
- Create a custom Closed List entity called "IssueType" with values: Password Reset, Software Install, Hardware Repair, Network Issue
- Build a topic "Report an IT Issue" that asks for: (1) User's name [Person entity], (2) Issue type [IssueType entity], (3) Urgency level [Number 1-5]
- Use a Condition node: if Urgency β₯ 4, send a different message than if Urgency < 4
- End with: "Thanks {Name}, your {IssueType} issue (Priority {Urgency}) has been logged." using variables
- Bonus: Store the user's name in a
Global.UserNamevariable and use it in the Greeting topic too
Actions & Power Automate
Actions are how your Copilot does things β not just talks. Calling APIs, reading SharePoint lists, creating records in Dataverse, sending emails, booking meetings. All of this is done by connecting to Power Automate flows.
What's an Action?
Plugin Action
Connect to a Power Automate flow. Pass variables in, receive values back.
HTTP Request
Call external REST APIs directly from a topic. Supports GET, POST, PUT, DELETE.
Dataverse Action
Read or write records in Microsoft Dataverse (the data layer of Power Platform).
AI Builder Action
Call AI Builder models for document processing, classification, or prediction.
Building a Power Automate Integration
The HR bot needs to check an employee's actual remaining vacation days from an HR system. The bot asks for the employee ID, calls a Power Automate flow that queries a SharePoint list, and returns the days remaining.
Add Action Node to Topic
In your topic canvas, click + Add node β Call an action β Create a flow. This opens Power Automate in a new tab with a pre-built Copilot Studio trigger.
Define Input Parameters
In Power Automate, the trigger "When Copilot Studio calls a flow" lets you define input parameters. Add: EmployeeID (string). This is how you pass the variable from the bot to the flow.
Add the Logic
Add actions in Power Automate: Get item from SharePoint list (filter by EmployeeID). Extract the VacationDaysRemaining field.
Return Output to Bot
Add a "Return value(s) to Copilot Studio" step. Add output: VacationDays (number). Save and publish the flow.
Map I/O in the Topic
Back in Copilot Studio, the action node now shows input/output slots. Map EmployeeID β Topic.EmployeeID variable. Map output VacationDays β new variable Topic.DaysLeft.
The Power Automate Flow (Visual Summary)
Using the Return Value in the Topic
// Action node returns Topic.DaysLeft (number) CONDITION: Topic.DaysLeft > 0 β SEND: "You have {Topic.DaysLeft} vacation days remaining. π" ELSE: β SEND: "You have no vacation days left this year. Please contact HR if you believe this is an error."
HTTP Request Action (No-Code API Calls)
Method: GET URL: https://api.contoso.com/weather?city={Topic.City} Headers: Authorization: Bearer {Global.APIToken} Content-Type: application/json Response Body (JSON Path Mapping): Topic.Temperature β $.current.temp_c Topic.Condition β $.current.condition.text
Error Handling: Always add an On Error path after Action nodes. If a flow fails (API down, bad data), the bot should respond gracefully: "Sorry, I couldn't check that right now. Please try again later."
Live Data Integration
- Create a SharePoint list called "IT Assets" with columns: EmployeeID, AssetType, SerialNumber, Status
- Build a Power Automate flow: receive EmployeeID β query SharePoint β return AssetType and SerialNumber
- In your IT Support Copilot, add an action that calls this flow and displays the employee's assigned device
- Add error handling: if the employee ID returns no results, send a fallback message
- Bonus: Use an HTTP action to call a free public API (e.g.,
wttr.in/Montreal?format=j1) and display weather in a message
Generative AI & Knowledge Sources
This is where Copilot Studio becomes truly powerful: Generative Answers lets your bot answer questions from documents, websites, and SharePoint β without you writing a single topic for each question. Powered by Azure OpenAI GPT models.
What are Generative Answers?
Instead of manually authoring a topic for every possible question, you point the bot at a knowledge source and it uses GPT to generate grounded, accurate answers from that content automatically.
Documents
Upload PDFs, Word docs, or text files. The bot answers from their content.
Websites / URLs
Point to public web pages. The bot indexes and answers from them.
SharePoint
Connect to SharePoint sites. The bot searches and answers from your org's internal docs.
Dataverse / Custom
Plug in custom knowledge via connectors or Bing Search integration.
Setting Up Knowledge Sources
Go to Knowledge Tab
In the left nav, click Knowledge. Click + Add knowledge. Choose your source type (Public website, File, SharePoint, etc.).
Add a Public Website
Enter up to 2 URLs (e.g., https://support.contoso.com). Copilot Studio crawls and indexes the pages. Takes a few minutes to process.
Enable Generative Answers in Settings
Go to Settings β AI features β Generative answers. Toggle on "Allow the AI to use its own general knowledge" and "Use knowledge sources".
Test It
Ask a question your knowledge source can answer. The bot responds with a generated answer and cites the source. If no topic matches AND the knowledge source has an answer, it falls back to generative answers automatically.
Generative Answers Architecture
Generative Answers Inside a Topic
You can also trigger generative answers within a specific topic node, for more controlled use:
// In a topic, add a "Generative answers" node Input: Activity.Text // User's latest message Sources: ["HR Policy Website", "Employee Handbook PDF"] // This searches ONLY those sources, not your whole knowledge base // Output is a generated response grounded in those documents Fallback behavior: If no answer found β redirect to Escalate topic
Content Moderation & Safety
| Feature | What it does |
|---|---|
| Content moderation | Blocks harmful, offensive, or off-topic responses from GPT |
| Grounding only | Bot ONLY answers from your documents β no hallucination from general knowledge |
| Citation display | Shows source document/URL in the response for trust and transparency |
| Sensitivity labels | Respect Microsoft Purview labels β doesn't expose restricted content |
RAG Pattern: This is Retrieval-Augmented Generation under the hood β the same architecture you've studied for agentic systems. Copilot Studio just abstracts the embedding, chunking, and vector search layers into a no-code configuration.
RAG-Powered Knowledge Bot
- Upload a PDF (a product manual, policy doc, or any multi-page document) as a knowledge source
- Add a public URL (your company's FAQ page, or any public site) as a second source
- Test 5 questions β 3 that ARE in the document, 2 that are NOT. Observe the difference in responses
- Enable "grounding only" mode β re-test the 2 out-of-scope questions. What changes?
- Bonus: Create a topic that uses a Generative Answer node scoped to only one knowledge source for a specific topic area
Deployment & Channels
Your Copilot is ready. Now let's get it in front of real users. Copilot Studio supports deployment to multiple channels β from Microsoft Teams to custom websites to WhatsApp β all from the same configuration.
Publishing Your Copilot
Review & Validate
Before publishing, use Topic Checker (the warning icon in the top bar) to find any broken nodes, missing variables, or disconnected paths.
Click Publish
Hit the Publish button (top right). The bot compiles and deploys to all connected channels. Publishing usually takes 30β60 seconds.
Share via Demo Link
Under Settings β Channels β Demo website, you get a hosted demo URL to share immediately. Great for stakeholder demos without full deployment.
Channel Overview
| Channel | Use Case | Setup Complexity |
|---|---|---|
| π₯οΈ Demo Website | Internal testing, stakeholder demos | Zero β instant link |
| π Custom Website | Embed in your own site or portal | Low β copy/paste embed code |
| πΌ Microsoft Teams | Internal employees, HR/IT bots | Low β Teams app setup |
| π± Mobile App | Native app integration | Medium β Direct Line SDK |
| π WhatsApp | Customer-facing support | Medium β Meta Business Account needed |
| π€ Slack | Dev teams, external communities | Medium β Slack App setup |
| π‘ Direct Line | Custom channels, Power Apps | High β API integration |
Embedding on a Website
<!-- Add to your HTML <body> --> <script> var WebChat = {}; WebChat.onLoad = function() { WebChat.renderWebChat({ directLine: WebChat.createDirectLine({ token: 'YOUR_BOT_TOKEN_HERE' }), styleOptions: { botAvatarInitials: 'HR', accent: '#0063B1', bubbleBorderRadius: 8 } }, document.getElementById('webchat')); }; </script> <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js" onload="WebChat.onLoad()"></script> <div id="webchat" style="height:500px; width:400px;"></div>
Deploying to Microsoft Teams
Enable Teams Channel
In Copilot Studio β Settings β Channels β Microsoft Teams. Click Turn on Teams. This creates a Teams app package.
Submit to Teams Admin
Download the app package (ZIP). In Microsoft Teams Admin Center, upload it as a custom app. Assign it to specific users or teams.
Enable Proactive Messaging (Optional)
Your bot can send messages without the user initiating first β e.g., send a reminder when a ticket SLA is approaching. Configure via Power Automate + Teams connector.
Analytics & Monitoring
After deployment, use the Analytics tab to monitor:
| Metric | What to look for |
|---|---|
| Session count | Volume of conversations over time |
| Engagement rate | % of sessions where users engaged vs. abandoned |
| Resolution rate | % of sessions resolved without escalation |
| Escalation rate | How often users say "talk to a human" (high = bot not helping) |
| Unrecognized phrases | Top phrases that hit the Fallback β these become new topics |
| Topic volume | Which topics are used most β tells you where to invest |
Continuous Improvement Loop: Review "Unrecognized phrases" weekly. These are real user questions your bot can't answer β each one is a new topic to build. This feedback loop is how production bots improve over time.
Authentication & Security
No Auth
Public bot, no login. Anyone can chat. Good for external FAQ bots.
Azure AD (SSO)
Authenticate with Microsoft account. Bot knows who you are. Good for internal bots accessing personal data.
Generic OAuth 2.0
Connect to any OAuth provider (Google, Okta, custom IdP). For external customer-facing bots.
Manual (Token)
Pass a token via the embed code for server-side authentication scenarios.
Deploy Your Production-Ready Bot
Bring everything together into a complete, deployable Copilot.
- Build: A complete bot with β₯ 5 custom topics, 2 Power Automate integrations, and 1 knowledge source
- Security: Configure authentication (Azure AD for internal or No Auth for external use case)
- Deploy: Publish and share a Demo Website link β test on mobile and desktop
- Teams: Enable the Teams channel and install the bot in your personal Teams chat
- Analyze: Generate 20 test sessions with varied inputs, then review Analytics β list 3 improvements
- Document: Write a 1-page handover doc: bot purpose, topics map, integrations, and maintenance guide
π Course Complete! You now have the skills to design, build, integrate, and deploy Microsoft Copilot Studio bots from scratch. The next steps: explore Copilot Extensions (custom plugins via OpenAPI), Copilot Studio + Azure AI Foundry for pro-code hybrid architectures, and Multi-bot orchestration patterns.